.pragma library

Qt.include("./Util/Database.js");
Qt.include("./Util/Util.js");
Qt.include("./WebAccess/TwitterAPI.js");
Qt.include("./WebAccess/HttpAccess.js");

var TYPE_COMMAND = 0;
var TYPE_CHECK_USER = 1;
var TYPE_TWEET_PING = 2;

var STR_HASHTAG = " #sakidoritter";

var STR_PING_TWEET_LIST = ["ちゃんと働いてますよ。"
            , "ときどきはつぶやかないと。"
            , "いそがしいのですよ。"
            , "さぼって・・・ないですよ！"
            , "はっ、、、"
            , "24時間営業です～。"
            , "みなさんはどんな商品が気になるのでしょうか？"
            , "今日はどんな商品が登録されるのかな？"
            , "キーワードは５つまでですよ。"
            , "登録キーワードの確認はメンションで[SHOW]ってしてくださいね。メッセージも付けてくれると嬉しいです。"
            , "キーワードの登録の時は「[ADD] 文字列」ってしてくださいね。"];

var STR_SHOW_MESSAGE_LIST = ["が登録されてるよ"
                             , "・・・だと、思うよ"
                             , "・・・かな・・・？"
                             , "だね、ちゃんと覚えてるよ"
                             , "ですよ。あってるかな？"]

var _model = null;
var _defaultItemCount = 5;

WorkerScript.onMessage = function(message) {
    outputDebugString("start worker script(command)");

    _model = message.dest_model;

    switch(message.command_type){
    case TYPE_COMMAND:
        // コマンド処理
        checkCommand();
        break;
    case TYPE_CHECK_USER:
        // フォローされてる情報を更新する
        checkUser();
        break;
    case TYPE_TWEET_PING:
        // 動作確認つぶやき
        tweetPing();
        break;
    default:
        break;
    }

    outputDebugString("end worker script(command)");

    // メインスレッドへの応答
    WorkerScript.sendMessage({ "result": true, "split": 0 })
}




// コマンドの処理
function checkCommand(){
    var since = readData(SETTING_KEY_TWEET_SINCE_ID);
    since = (since === undefined) ? "1000" : (parseInt(since) + 1);

    // デバッグ
//    since = "1000";

    outputDebugString("since_id=" + since);

    _count = 200;
    var url = getMentionURL(1, since);
    var obj = new requestHttpEx("", "GET", url, true
                                , responseMention
                                , null);
}

// メンションの取得
function responseMention(object){
    var json = eval("(" + object.responseText + ")");
    var repeat = [];
    var temp = "";

    // 解析と実行
    for(var i=json.length-1; i>=0; i--){
        if(i === 0){
            // since id保存
            saveData(SETTING_KEY_TWEET_SINCE_ID, String(json[i].id));
        }
        // 解析
        temp = analyzeCommand(json[i].text, json[i].user.screen_name
                              , json[i].id);
        if(temp.length > 0){
            repeat[json[i].user.screen_name] = temp;
        }
    }
    // 解析して一番最近のコマンドの応答をする
    var cmd = "";
    for(cmd in repeat){
        if(repeat[cmd].length > 0){
            if(repeat[cmd].length > 140){
                repeat[cmd] = repeat[cmd].substring(0, 135) + " ...";
            }
            // ついーと
            sendTweet(repeat[cmd], "", reponseTweet);
            // ログ
            outputLog(_model, "tweet : " + repeat[cmd]);
        }
    }

    // 終了ログ
    outputLog(_model, "finisth: command operation");
}
// 送信確認
function reponseTweet(obj){
    outputDebugString("tweeted");
}
// コマンド解析(DB操作はこの中で返信する文字列を戻す）
function analyzeCommand(text, user_id, status_id){
    var ret = "";
    var items = [];

    outputDebugString("text="+ text + ",name=" + user_id + ",status_id=" + status_id);

    items = text.split(" ");
    if(items.length < 2){
        // mention じゃない
        outputDebugString("not mention 1");
        // outputLog(_model, "not mention 1:" + user_id + ":" + text);
    }else if(items[0].toLowerCase() !== "@sakidoritter"){
        // mention じゃない
        outputDebugString("not mention 2");
        // outputLog(_model, "not mention 2:" + user_id + ":" + text);
    }else{
        // ユーザーリスト取得
        var user= readUserInfo(user_id);
        if(user.length === 0){
            // NG
            // 登録されたユーザーじゃないので無視

        // コマンドの保存と既存チェック
        }else if(!saveCommandHistory(user_id, status_id)){
            // 既に処理済み

        }else if(items[1] === "[ADD]"){
            // 追加
            var category = "All";
            text = text.replace(items[0] + " ", "");
            text = text.replace(items[1] + " ", "");
            text = text.substring(0, 20);
            if(saveKeyword(user_id, category, text, user[0].item_count) === 0){
                // exist
                outputLog(_model, "exist keyword : " + user_id + ", " + category + ", " + text);
            }else{
                // add
                outputLog(_model, "add keyword : " + user_id + ", " + category);// + ", " + _keyword.text);
            }
        }else if(items[1] === "[SHOW]"){
            // 参照
            outputDebugString("show");

            var msg = selectOne(STR_SHOW_MESSAGE_LIST);
            var data = readKeyword(user_id);
            ret = "@" + user_id + " 「";
            for(var i=0; i<data.length; i++){
                if(i > 0){
                    ret += "/";
                }
                // 返信データにカテゴリを入れるのはしばらく控える
                ret += /*data[i].category + ":" + */data[i].keyword;
            }
            ret += "」" + msg + STR_HASHTAG;

        }else{
            outputLog(_model, "command not found:" + user_id + ":" + text);
        }
    }
    return ret;
}



// ユーザー情報を作成
function checkUser(){
    var url = getFriendsFollowersIdsURL(false);
    var obj = new requestHttpEx("", "GET", url, true
                                           , responseFollowersIds
                                           , null);
}
// ユーザーID一覧
function responseFollowersIds(object){
    var json = eval("(" + object.responseText + ")");
    var id_string = "";

    // いきなり１００ことないだろうから制限あり

    for(var i=0; i<json.ids.length; i++){
        if(i >= 100){
            break;
        }
        if(i > 0){
            id_string += ",";
        }
        id_string += json.ids[i];
        outputDebugString("ids[" + i + "]:" + json.ids[i]);
    }
    // 続いてフォロワーリスト取得
    if(id_string.length > 0){
        var url = getUsersLookupURL(id_string);
        var obj = new requestHttpEx("", "GET", url, true
                                               , responseFollowersList
                                               , null);
    }
}

// フォロワーリスト
function responseFollowersList(object){
    var json = eval("(" + object.responseText + ")");

    for(var i=0; i<json.length; i++){
        outputDebugString("screen_name[" + i + "] : " + json[i].screen_name);
        if(saveUserList(json[i].screen_name, _defaultItemCount) === 0){
            // exist
            outputLog(_model, "exist user[" + i + "] : " + json[i].screen_name);
        }else{
            // add
            outputLog(_model, "add user[" + i + "] : " + json[i].screen_name);

            // フォロー返し
            var obj = sendFriendshipRequest(json[i].screen_name
                                                       , responseFriendshipRequest);
        }
    }
}

// フォロー返しへのレスポンス
function responseFriendshipRequest(object, param){
    if(object.status == 200){
        // ok
        outputLog(_model, "follow user : " + param);
    }else{
        // ng
        outputLog(_model, "fail follow user : " + param);
    }
}



// 動作確認つぶやき
function tweetPing(){
    var msg = selectOne(STR_PING_TWEET_LIST);
    msg += "　\nただいまは" + Qt.formatDateTime(new Date(), "MM/dd hh:mm") + "ですね。"
    outputLog(_model, msg);
    sendTweet(msg, "", responseTweet);
}

// つぶやきのレスポンス
function responseTweet(object){
    outputDebugString("tweeted");
}
